<?php
namespace helper;
class File {
	// 替换的别名
	public static $aliasGroup = 'default';
	public static $aliasMaps = [];
	
	/**
	 * @param $dir		查找路径
	 * @param $pattern	匹配模式
	 * 
	 * 		default		当前目录文件夹和文件
	 * 		folders		当前目录文件夹
	 * 		files		当前目录文件
	 * 
	 * 		allfolders	目录下所有文件夹
	 * 		allfiles	目录下所有文件
	 * 		all			目录下所有文件夹和文件
	 * 
	 * @param $ext		文件扩展名
	 * @return array
	*/
	public static function find(string $dir,string $pattern='default',string $ext=''){
		if($pattern=='folders' or $pattern=='allfolders'){
			$files=glob(rtrim($dir,DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.'*',GLOB_ONLYDIR);
		}else{
			if($ext and strpos($ext,'.')===false){
				$ext="*.{$ext}";
			}
			if(!$ext){
				$ext="*";
			}
			$files=glob(rtrim($dir,DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.$ext);
		}
		$result=[];
		foreach($files as $file){
			if(is_dir($file) and ($pattern=='allfolders' or $pattern=='allfiles' or $pattern=='all')){
				$result=array_merge($result,self::find($file,$pattern,$ext));
			}
			if($pattern=='all' or $pattern=='default'){
				$result[]=$file;
			}if(is_dir($file)){
				if($pattern=='allfolders' or $pattern=='folders'){
					$result[]=$file;
				}
			}elseif(is_file($file)){
				if($pattern=='allfiles' or $pattern=='files'){
					$result[]=$file;
				}
			}
		}
		return $result;
	}
	
	
	
	
	// 当前目录文件
	public static function findFiles($dir,$ext=''){
		return self::find($dir,'files',$ext);
	}
	// 当前目录文件夹
	public static function findFolders($dir){
		return self::find($dir,'folders');
	}
	// 目录下所有文件
	public static function findAllFiles($dir,$ext=''){
		return self::find($dir,'allfiles',$ext);
	}
	// 目录下所有文件夹
	public static function findAllFolders($dir){
		return self::find($dir,'allfolders');
	}
	// 目录下所有文件夹和文件
	public static function findAll($dir){
		return self::find($dir,'all');
	}
	
	// 保存JSON内容到文件
	public static function saveJson($file,$content){
		if(!is_string($content)){
			$content = json_encode($content);
		}
		return self::saveCont($file,$content);
	}
	// 从JSON文件读取内容
	public static function loadJson($file){
		return json_decode(file_get_contents($file),true);
	}
	
	// 读取或保存文件内容
	public static function cont($file,$content=null){
		if(!is_null($content))
		{
			return self::saveCont($file,$content);
		}
		return self::loadCont($file);
	}
	// 保存内容到文件
	public static function saveCont($file,$content){
		self::mkdir(dirname($file));
		return file_put_contents($file,$content);
	}
	// 从文件读取内容
	public static function loadCont($file){
		return file_get_contents($file);
	}
	
	// 追加内容到文件
	public static function append($file,$content){
		self::mkdir(dirname($file));
		file_put_contents($file,$content,FILE_APPEND);
	}
	
	// 检查目录是否存在
	public static function dir($dir,$default=null){
		if($dir and is_dir($dir=self::path($dir))){
			return $dir;
		}
		$default = self::path($default);
		return $default;
	}
	
	// 检查目录是否存在
	public static function file($file,$default=null,$ext=null){
		$file = self::path($file);
		$file = self::addExt($file,$ext);
		if(is_file($file)){
			return $file;
		}
		return self::addExt($default,$ext);
	}
	
	// 规范路径字符串
	public static function path(){
		$args = func_get_args();
		$ds = DIRECTORY_SEPARATOR;
		foreach($args as $key=>$str) {
			$args[$key] = str_replace(['\\','/'],$ds,$str);
		}
		$path = implode($ds,$args);
		
		while(strpos($path,$ds.$ds)!==false){
			$path=str_replace($ds.$ds,$ds,$path);
		}
		while(strpos($path,'..')!==false){
			$path=str_replace('..','.',$path);
		}
		$arr = explode($ds,$path);
		
		if($arr[0] and strpos($arr[0],':')>1)
		{
			$aliasArr = explode(':',$arr[0]);
			if(!$aliasArr[0]) {
				$group = self::$aliasGroup;
			} else {
				$group = $aliasArr[0];
			}
			$name = $aliasArr[1];
			if($name and $mapData=self::$aliasMaps[$group]) {
				if($alias = $mapData[$name]){
					$arr[0] = $alias;
				}
			}
		}
		$path = implode($ds,$arr);
		
		return rtrim($path,$ds);
	}
	
	// 创建文件夹
	public static function mkdir($path){
		if(!is_dir($path)) {
			return mkdir($path,0755,true);
		}
	}
	
	// 文件大小
	public static function size($path){
		return filesize($path);
	}
	
	// 文件扩展名
	public static function ext($file){
		return pathinfo($file, PATHINFO_EXTENSION);
	}
	
	// 给文件添加扩展名
	public static function addExt($file,$ext){
		$ext = ltrim($ext,'.');
		if(!$ext or !$file)return $file;
		if($ext != self::ext($file))
		{
			return $file.'.'.$ext;
		}
		return $file;
	}
	
	
	
	
	
	
	
	// 指定目录别名分组
	public static function aliasGroup(string $group=null){
		if(is_null($group)){
			$group = 'default';
		}
		self::$aliasGroup = $group;
	}
	// 添加目录别名
	public static function alias(string $name,string $value,string $group=null){
		if(is_null($group)){
			$group = self::$aliasGroup;
		}
		self::$aliasMaps[$group][$name] = $value;
	}
}